package com.wande.dataplatform.filecollection.parser;

import lombok.Data;
import lombok.Builder;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import com.wande.common.json.utils.JsonUtils;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 解析器配置类
 * 包含文件解析所需的各种配置参数
 *
 * @author dataplatform
 * @date 2025-01-24
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ParserConfig {

    /**
     * 文件编码格式
     */
    @Builder.Default
    private Charset charset = StandardCharsets.UTF_8;

    /**
     * 是否包含表头
     */
    @Builder.Default
    private Boolean hasHeader = true;

    /**
     * 起始行号（从0开始）
     */
    @Builder.Default
    private Integer startRow = 0;

    /**
     * 结束行号（-1表示到文件末尾）
     */
    @Builder.Default
    private Integer endRow = -1;

    /**
     * CSV分隔符
     */
    @Builder.Default
    private Character delimiter = ',';

    /**
     * CSV引号字符
     */
    @Builder.Default
    private Character quoteChar = '"';

    /**
     * CSV转义字符
     */
    @Builder.Default
    private Character escapeChar = '\\';

    /**
     * Excel工作表名称（为空则使用第一个工作表）
     */
    private String sheetName;

    /**
     * Excel工作表索引（从0开始）
     */
    @Builder.Default
    private Integer sheetIndex = 0;

    /**
     * XML根节点XPath表达式
     */
    private String rootXPath;

    /**
     * XML数据节点XPath表达式
     */
    private String dataXPath;

    /**
     * JSON根路径（JSONPath表达式）
     */
    private String jsonRootPath;

    /**
     * JSON数据路径（JSONPath表达式）
     */
    private String jsonDataPath;

    /**
     * 批量处理大小
     */
    @Builder.Default
    private Integer batchSize = 1000;

    /**
     * 是否启用流式解析（大文件模式）
     */
    @Builder.Default
    private Boolean streamMode = false;

    /**
     * 流式解析阈值（字节数，超过此大小自动启用流式解析）
     */
    @Builder.Default
    private Long streamThreshold = 100 * 1024 * 1024L; // 100MB

    /**
     * 是否跳过空行
     */
    @Builder.Default
    private Boolean skipEmptyRows = true;

    /**
     * 是否去除字段前后空格
     */
    @Builder.Default
    private Boolean trimFields = true;

    /**
     * 日期格式
     */
    @Builder.Default
    private String dateFormat = "yyyy-MM-dd HH:mm:ss";

    /**
     * 扩展配置（用于特殊解析器的自定义配置）
     */
    @Builder.Default
    private Map<String, Object> extendedConfig = new HashMap<>();

    /**
     * 添加扩展配置
     *
     * @param key 配置键
     * @param value 配置值
     */
    public void addExtendedConfig(String key, Object value) {
        if (this.extendedConfig == null) {
            this.extendedConfig = new HashMap<>();
        }
        this.extendedConfig.put(key, value);
    }

    /**
     * 获取扩展配置
     *
     * @param key 配置键
     * @return 配置值
     */
    public Object getExtendedConfig(String key) {
        return this.extendedConfig != null ? this.extendedConfig.get(key) : null;
    }

    /**
     * 从JSON字符串创建ParserConfig对象
     *
     * @param json JSON字符串
     * @return ParserConfig对象
     */
    public static ParserConfig fromJson(String json) {
        return JsonUtils.parseObject(json, ParserConfig.class);
    }

    /**
     * 将ParserConfig对象转换为JSON字符串
     *
     * @return JSON字符串
     */
    public String toJson() {
        return JsonUtils.toJsonString(this);
    }
}
